package transporte.server.seguridad;

import java.util.HashMap;
import java.util.List;
import java.util.Map;

import javax.annotation.Resource;
import javax.servlet.http.HttpSession;

import org.springframework.stereotype.Service;

import transporte.server.dao.EstadoDao;
import transporte.server.dao.UsuarioDao;
import transporte.server.entity.Estado;
import transporte.server.entity.Perfil;
import transporte.server.entity.Privilegio;
import transporte.server.entity.Usuario;
import transporte.web.seguridad.SeguridadController;

@Service
public class SeguridadService {

	private UsuarioDao usuarioDao;
	private EstadoDao estadoDao;
	
	/**
	 * @author spulido
	 * @param usuarioDao
	 */
	@Resource
	public void setUsuarioDao(UsuarioDao usuarioDao) {
	    this.usuarioDao = usuarioDao;
    }
	
	/**
	 * @author lagudelo
	 * @param estadoDao
	 */
	@Resource
	public void setEstadoDao(EstadoDao estadoDao) {
	    this.estadoDao = estadoDao;
    }
	
	/**
	 * @author lagudelo
	 * @param idEstado
	 * @return
	 */
	public Estado getEstado(long idEstado) {
		return estadoDao.getById(idEstado);
    }
	
	/**
	 * @author spulido
	 * @param login
	 * @return
	 */
	public Usuario getUsuarioByLogin(String login) {
		return usuarioDao.getByLogin(login);
    }
	
	
	/**
	 * @author spulido
	 * @param idPersona
	 * @return
	 */
	public Usuario getUsuarioById(long idPersona) {
		return usuarioDao.getById(idPersona);
    }

	/**
	 * @author spulido
	 * @param usuario
	 * @return
	 */
	public Map<String, Boolean> getPrivsManager(Usuario usuario) {
	    Map<String, Boolean> privManager = new HashMap<String, Boolean>();
	    Perfil perfil = usuario.getPerfil();
	    if (perfil == null)
	    	return privManager;
	    
	    if (perfil.getPrivilegios() == null || perfil.getPrivilegios().isEmpty())
	    	return privManager;
	    
	    for (Privilegio priv : perfil.getPrivilegios()) {
			privManager.put(priv.getPrivilegio(), Boolean.TRUE);
		}
	    return privManager;
    }

	/**
	 * @author spulido
	 * @param usuario
	 * @return
	 */
	public Usuario getUsuarioEvicted(Usuario usuario) {
	    usuarioDao.evict(usuario);
	    return usuario;
    }

	public boolean hasPrivs(HttpSession session, boolean allRequired, String... privs) {
		Map<String, Boolean> privManager = (Map<String, Boolean>) session.getAttribute(SeguridadController.PRIV_MANGER);
		
		boolean privsValid = false;
		for(String priv : privs) {				

			if (!Boolean.TRUE.equals(privManager.get(priv))) {
				privsValid = false;
				if (allRequired) break;
			} else {
				privsValid = true;
				if (!allRequired) break;
			}
		}
		return privsValid;
    }
}
